package com.foton.lotteryinterfaces.interfaces.assembler;

import org.mapstruct.InheritConfiguration;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.MapperConfig;
import org.mapstruct.Mapping;

import java.util.List;
import java.util.stream.Stream;

/**
 * @Author RenPu
 * @Date 2024/1/5 17:14
 * @Version 1.0
 * @Description: 实体转换映射 -接口定义层
 **/

@MapperConfig
public interface IMapping <SOURCE,TARGET> {

    /**==========================对象与对象转换====================================**/

    /**
     * 映射同名属性
     * @param source 源
     * @return     结果
     */
    @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")  //字段映射，时间类型等的处理
    public TARGET sourceToTarget(SOURCE source);

    /**
     * 映射同名属性
     * @param target 源   (反向转换)
     * @return     结果
     */
    @InheritInverseConfiguration(name = "sourceToTarget")   //通过此注解完成反向
    public SOURCE targetToSource(TARGET target);



    /**==========================集合与集合转换====================================**/


    /**
     * 映射同名属性
     * @param sourceList 源
     * @return     结果
     */
    @InheritConfiguration(name = "sourceToTarget")
    public List<TARGET> sourceListToTargetList(List<SOURCE> sourceList);


    /**
     * 映射同名属性
     * @param targetList 源   (反向转换)
     * @return     结果
     */
    @InheritConfiguration(name = "targetToSource")
    public List<SOURCE> targetListToSourceList(List<TARGET> targetList);


    //流对象与流对象得转换

    /**
     * 映射同名属性，集合流形式
     * @param stream 源
     * @return       结果
     */
    List<TARGET> sourceToTarget(Stream<SOURCE> stream);

    /**
     * 反向，映射同名属性，集合流形式
     * @param stream 源
     * @return       结果
     */
    List<SOURCE> targetToSource(Stream<TARGET> stream);
}
